// 使用vue-router
import Vue from 'vue';
import VueRouter from 'vue-router';
// 引入router配置
import routes from '@/router/routes';
Vue.use(VueRouter);
//引入store,为登录了不会有登录页面出现做准备
import store from '@/store';
// 重写push与replace
let originPush = VueRouter.prototype.push;
let originReplace = VueRouter.prototype.replace;
//只考虑两回调都有的情况
VueRouter.prototype.push = function (location, resolve, reject) {
    if (resolve && reject) {
        originPush.call(this, location, resolve, reject)
    } else {
        originPush.call(this, location, () => { }, () => { })
    }
}
VueRouter.prototype.Replace = function (location, resolve, reject) {
    if (resolve && reject) {
        originReplace.call(this, location, resolve, reject)
    } else {
        originReplace.call(this, location, () => { }, () => { })
    }
}

// 配置路由
let router = new VueRouter({
    routes,
    //滚动行为，进阶的路由知识
    scrollBehavior(to, from, savedPosition) {
        //返回的这个y=0，代表的滚动条在最上方
        return { y: 0 };
    },
})

//全局守卫：前置守卫（在路由跳转之前进行判断）
router.beforeEach(async (to, from, next) => {
    //to:可以获取到你要跳转到那个路由信息
    //from:可以获取到你从哪个路由而来的信息
    //next:放行函数 
    //next()，放行
    //next(path)，放行到指定的路由
    //next(false),中断路由导航，回到跳转前的路径，出现的场景：可能是用户直接通过输入路径导航到的；或者通过导航记录进行跳转

    //为了测试，全放行
    // next();

    //用户登录了，才会有token，未登录一定不会有token，
    // 1. token是放着一个函数，只有等别人调用，才能运行一次，不然就是定义在那里，并没有使用
    // 2. 调用了token的，只有登录页面的登录按钮，派发的action
    // 是为了存放本地库
    // 3. action派发的mutation也调用了
    // 4. 请求拦截器也调用了

    // 是为了存放vuex的仓库中
    let token = store.state.user.token;
    //用户信息,判断userInfo里面是否有东西，决定是否在一次派发获取用户信息
    //userInfo默认为空对象，空对象判断为true
    let name = store.state.user.userInfo.name;
    //用户登录了
    if (token) {
        //用户登录了，就不能去login了
        if (to.path == '/login') {
            //用户登录了，还想去login，停留在首页
            // console.log('1');
            next('/home');
        } else {
            //登录了，但是去的不是login
            //处理其他组件刷新，就丢失用户名的bug
            if (name) {
                // console.log('2');
                next();
            } else {
                //没有用户信息，派发action，让仓库存储用户信息，再跳转
                try {
                    await store.dispatch("getUserInfo");
                    // console.log('3');
                    next();
                } catch (error) {
                    //token失效了，获取不到用户的信息，重新登录
                    //1. 清空token的本地存储，仓库的token，调用退出登录
                    //2. 回到login
                    await store.dispatch('userLogout');
                    // console.log('4');
                    next('login');
                }
            }

        }
    } else {
        //未登录,交易相关（trade)、支付相关(pay、paysuccess)、用户中心(center) 相关跳转 到 登录页面
        let toPath = to.path;
        if(toPath.indexOf('/trade') != -1 ||toPath.indexOf('/pay') != -1||toPath.indexOf('/center') != -1){
            //把未登录的时候想去而没去成的信息，存储于地址栏中，query参数
            next('login?redirect='+toPath);
        }else{
            //去的不是上面的路由，放行
            next();
        };
        
    };
});

//对外暴露
export default router;